/**
 * npm install bip39 ethereumjs-wallet ethereumjs-util --save
 * 
 * bip39：实作 BIP39，随机产生新的 mnemonic code，并可以将其转成 binary 的 seed。
 * ethereumjs-wallet：产生和管理公私钥，我使用其中的 hdkey 子套件来创建 HD Wallet。
 * ethereumjs-util：集合许多 Ethereum 需要的运算功能
 * m / purpose' / coin_type' / account' / change / address_index
 * 44 — BIP 44 Purpose
 * 60 — Ethereum’s coin type
 * 0 — Account 0
 * 0 — Chain 0
 * 
 * bip39 (for mnemonic generation)
 * hdkey (implementation of BIP 32)
 * ethereumjs-util (henceforth ethUtil)
 * ethereumjs-tx (henceforth ethTx)
 * web3 (for communicating to an Ethereum node)
 * 
 */

var bip39 = require('bip39');
var hdkey = require('ethereumjs-wallet/hdkey');
var util = require('ethereumjs-util');
let language = 'en-US';
(language === 'zh-CN') ? (language = bip39.wordlists.chinese_simplified) : (language = bip39.wordlists.english);
//产生 mnemonic code
var mnemonic = bip39.generateMnemonic(null,null,language);
console.log('mnemonic:==>', mnemonic);
//取得的 mnemonic code
var seed = bip39.mnemonicToSeed(mnemonic);
console.log('seed:==>', seed);
//产生 HD wallet
// 先将 mnemonic code 转成 binary 的 seed。
//使用 seed 产生 HD Wallet。如果要说更明确，就是产生 Master Key 并记录起来。
var hdWallet = hdkey.fromMasterSeed(seed);
console.log('hdWallet:==>', hdWallet);
/**
 * 产生第一个 Ethereum Address
 * 产生 Wallet 中第一个帐户的第一组 keypair。可以从 Master Key，根据其路径 m/44'/60'/0'/0/0 推导出来。
 */
var key1 = hdWallet.derivePath("m/44'/60'/0'/0/0");
console.log('key1:==>', key1);
//使用 keypair 中的公钥产生 address。取得的 Address：685ce4cbdd5c19b64ca008cb85b83947e5318efa
var address1 = util.pubToAddress(key1._hdkey._publicKey, true);
console.log('address1:==>', address1);
/**为了避免大家打错 address（导致把钱送错人），Ethereum 不让 Address 变得比较难打！总之一般会用 EIP55: Mixed-case checksum address encoding 再进行编码。许多钱包也支援用户输入没经过编码的 Address，那就会跳过 checksum 机制，建议还是使用编码过的 Address。 */
//最后取得的 Address 会像：
// 0x685ce4CbDd5c19b64CA008cB85b83947e5318EFA
address1 = util.toChecksumAddress(address1.toString('hex'));
console.log('address1:==>', address1);